//宏断言，事件机制，可以有多个测试套件，一个测试套件之中可以有多个测试单元；其中测试事件分为全局测试、独立测试
//全局测试套件，继承类 testing::Environment ,需要对虚函数 SetUp TearDown进行重写，创建测试单元是使用TEST
//独立测试套件，继承类 testing::Test ，需要实现静态函数SetUpTestCase TearDownTestCase ，也可实现SetUp TearDown ，创建测试单元的时候使用TEST_F
#include<iostream>
#include<gtest/gtest.h>
#include<unordered_map>

//单元测试
// TEST(test,great_than)
// {
//     int age = 10;
//     ASSERT_GT(age , 6);
//     printf("OK\n");
// }

// //可以同时存在多个测试单元
// TEST(test, less_than)
// {
//     int age = 21;
//     EXPECT_LT(age , 18);
//     printf("OK\n");
// }

// TEST(test, Less_than)
// {
//     int age = 21;
//     ASSERT_LT(age , 18);
//     printf("OK\n");
// }
//ASSERT_ 断言失败会退出
//EXPECT_ 断言失败继续运行
//需要注意的是断言宏必须在单元测试宏函数中使用

// int main(int argc , char* argv[])
// {
//     testing::InitGoogleTest(&argc , argv);
//     int ret = RUN_ALL_TESTS();//运行所有测试
//     return 0;
// }

//全局测试套件
// class MyEnvironment : public testing::Environment
// {
// public:
//     //重写虚函数
//     virtual void SetUp() override
//     {
//         std::cout << "单元测试执行前的环境初始化" << std::endl;
//     }
//     virtual void TearDown() override
//     {
//         std::cout << "单元测试执行完毕之后的环境清理" << std::endl;
//     }
// };

// //单元测试的主测试名设置为全局测试类的类名
// TEST(MyEnvironment , test1)
// {
//     std::cout << "单元测试test1" << std::endl;
// }
// TEST(MyEnvironment , test2)
// {
//     std::cout << "单元测试test2" << std::endl;
// }

// //可以同时存在多个测试套件
// //会在所有单元测试前执行所有的初始化工作
// std::unordered_map<std::string , std::string> mymap;
// class MyMapTest : public testing::Environment
// {
// public:
//     //重写虚函数
//     virtual void SetUp() override
//     {
//         std::cout << "单元测试执行前的环境初始化" << std::endl;
//         //插入数据
//         mymap["hello"] = "你好";
//         mymap["world"] = "世界";
//     }
//     virtual void TearDown() override
//     {
//         std::cout << "单元测试执行完毕之后的环境清理" << std::endl;
//         //清理数据
//         mymap.clear();
//     }
// };
// TEST(MyMapTest, test1)
// {
//     ASSERT_EQ(mymap.size() , 2);
//     mymap.erase("hello");
// }
// TEST(MyMapTest , test2)
// {
//     ASSERT_EQ(mymap.size() , 2);
// }

// int main(int argc , char* argv[])
// {
//     testing::InitGoogleTest(&argc , argv);
//     testing::AddGlobalTestEnvironment(new MyEnvironment);
//     testing::AddGlobalTestEnvironment(new MyMapTest);

//     int ret = RUN_ALL_TESTS();
//     return 0;
// }
//事件机制值在测试前、后提供给用户自行添加操作的机制，而且该机制也可以让统一测试事件下的测试用例共享数据
//全局事件，针对整个测试程序，实现全局事件机制，需要我们自己创建一个类继承testing::Environment ，然后分别实现成员函数SetUp TearDown 的重写
//同时在main 函数内调用testing::AddGlobalTestEnviroment（new xxx）函数添加全局事件机制
// TestCase事件是指针对一个个测试用例，测试的事件机制的创建和测试套件的基本一样，但是需要设置的函数不同，对于独立事件来说，体现为 SetUpTeatCase TearDownTestCase
//并且是静态成员函数，也就是说对于独立事件中搞得单元测试来说，虽然他们可以访问同一个事件类，但是他们的 

//独立测试套件
class MyTest : public testing::Test
{
public: 
    static void SetUpTeatCase()
    {
        std::cout << "所有单元测试前执行初始化环境" << std::endl;
    }
    void SetUp()
    {
        std::cout << "单元测试 " << std::endl;
        _mymap["hello"] = "你好";
        _mymap["world"] = "世界";
    }
    void TearDown()
    {
        _mymap.clear();
        std::cout << "单元测试清理" << std::endl;
    }
    static void TearDownTestCase()
    {
        std::cout << "所有单元测试执行完毕之后清理环境" << std::endl;
    }
public:
    std::unordered_map<std::string,std::string> _mymap;//
};
//单元测试
TEST_F(MyTest , test1)//对于每一个单元测试来说，看到数据 _mymap 是隔离的
{
        // _mymap["hello"] = "你好";
        // _mymap["world"] = "世界";
        _mymap["hahahaha"] = "哈哈哈哈";
        ASSERT_EQ(_mymap.size() , 3);
}
TEST_F(MyTest , test2)
{
    ASSERT_EQ(_mymap.size() , 2);
}

int main(int argc , char* argv[])
{
    testing::InitGoogleTest(&argc , argv);
    int ret =RUN_ALL_TESTS();
    return 0;
}